//
// Created by Betty on 2016/12/22.
//
#include <jni.h>
#include <cwchar>
#include <opencv2/opencv.hpp>
using namespace cv;
extern "C"{
JNIEXPORT jintArray JNICALL
Java_com_betty_cannyimg_Canny_cannyImg(JNIEnv *env, jobject instance, jintArray buf_, jint w, jint h,jint threshold1,jint threshold2) {
    jint *buf = env->GetIntArrayElements(buf_, NULL);
    if (buf == NULL){
        return 0;
    }
    Mat myimg(h,w,CV_8UC4,(unsigned char*) buf);//java中读入的图像都是4通道的，所以这里myimg声明定义为CV_8UC4,以一个数组中的数据来建立Mat
    Mat grayimg;//灰度图
    cvtColor(myimg,grayimg,COLOR_RGBA2GRAY);//将4通道的myimg彩色图转为灰度图grayimg
    Mat pCannyImg;
    Canny(myimg,pCannyImg,threshold1,threshold2,3);//canny检测
    uchar* ptr = myimg.ptr(0);//因为边缘检测图最终以4通道bmp形式显示，所以将得到的边缘检测图pCannyImg的数据赋值到4通道的imageData中，
    for (int i = 0; i <w*h ; ++i) {
        //得到的canny图像原本是单通道，但java中显示bmp时只能4通道或三通道，为了使显示的图像是灰度的，把canny图像的数据值赋给一个4通道的myimg
        //对于一个int四字节，其彩色值存储方式为：BGRA
        ptr[4*i+1] = pCannyImg.data[i];
        ptr[4*i+2] = pCannyImg.data[i];
        ptr[4*i+0] = pCannyImg.data[i];
    }
    //以下部分是将得到canny图像存在数组中，以数组的形式返回
    int size = w*h;
    jintArray result = env->NewIntArray(size);
    env->SetIntArrayRegion(result,0,size,buf);
    env->ReleaseIntArrayElements(buf_, buf, 0);
    return result;
}
///改写的gray灰度化代码，返回值为存储灰度化图像数据的int数组jintArray，传递的参数存储原始图像数据的int数组，以及w和h
JNIEXPORT jintArray JNICALL
Java_com_betty_cannyimg_Canny_grayProc(JNIEnv *env, jobject instance, jintArray buf_, jint w,
                                       jint h) {
    jint *buf = env->GetIntArrayElements(buf_, NULL);//JNI传递int数组的方法
    if(buf == NULL){
        return 0;
    }
    Mat imgData(h,w,CV_8UC4,(unsigned char*)buf);//java中读入的图像都是4通道的，所以这里myimg声明定义为CV_8UC4,以一个数组中的数据来建立Mat
    Mat grayImg ;
    cvtColor(imgData,grayImg,COLOR_RGBA2GRAY);//将4通道的myimg彩色图转为灰度图grayimg
    uchar* ptr = imgData.ptr(0);//因为灰度图最终以4通道bmp形式显示，所以将得到的灰度图grayimg的数据赋值到4通道的imageData中，
    for(int i = 0; i < w*h; i ++){
        //计算公式：Y(亮度) = 0.299*R + 0.587*G + 0.114*B//去掉了原始程序中转换的公式
        //对于一个int四字节，其彩色值存储方式为：BGRA
        ptr[4*i+1] = grayImg.data[i];
        ptr[4*i+2] = grayImg.data[i];
        ptr[4*i+0] = grayImg.data[i];
    }
    //以下部分是将得到gray图像存在数组中，以数组的形式返回
    int size = w * h;
    jintArray result = env->NewIntArray(size);
    env->SetIntArrayRegion(result, 0, size, buf);
    env->ReleaseIntArrayElements(buf_, buf, 0);
    return result;
}
}

